gusucode.com > VC++ Flash(SWF)文件创建生成Lib库源码+demo-源码程序 > VC++ Flash(SWF)文件创建生成Lib库源码+demo-源码程序/code/SWFLIB_Library/SWFColorTransform.cpp
// SWFColorTransform.cpp: implementation of the CSWFColorTransform class. // ////////////////////////////////////////////////////////////////////// #include "SWFColorTransform.h" CSWFColorTransform::CSWFColorTransform(SWF_COLOR_TRANSFORM* colorTransform) { // Init members m_CXForm.Flags = 0; if (colorTransform != NULL) { m_CXForm.RedMultTerm = (USHORT)(colorTransform->RedMultTerm * 256); m_CXForm.GreenMultTerm = (USHORT)(colorTransform->GreenMultTerm * 256); m_CXForm.BlueMultTerm = (USHORT)(colorTransform->BlueMultTerm * 256); m_CXForm.AlphaMultTerm = (USHORT)(colorTransform->AlphaMultTerm * 256); m_CXForm.RedAddTerm = (USHORT)(colorTransform->RedAddTerm); m_CXForm.GreenAddTerm = (USHORT)(colorTransform->GreenAddTerm); m_CXForm.BlueAddTerm = (USHORT)(colorTransform->BlueAddTerm); m_CXForm.AlphaAddTerm = (USHORT)(colorTransform->AlphaAddTerm); } else { m_CXForm.RedMultTerm = m_CXForm.GreenMultTerm = m_CXForm.BlueMultTerm = m_CXForm.AlphaMultTerm = 0; m_CXForm.RedAddTerm = m_CXForm.GreenAddTerm = m_CXForm.BlueAddTerm = m_CXForm.AlphaAddTerm = 0; } m_SWFStream = NULL; m_SWFStreamLength = 0; } CSWFColorTransform::~CSWFColorTransform() { if (m_SWFStream != NULL) { delete m_SWFStream; m_SWFStream = NULL; } } UCHAR* CSWFColorTransform::BuildSWFStream() { int redAdd = abs((int)((short)abs(m_CXForm.RedAddTerm))); int greenAdd = abs((int)((short)abs(m_CXForm.GreenAddTerm))); int blueAdd = abs((int)((short)abs(m_CXForm.BlueAddTerm))); int alphaAdd = abs((int)((short)abs(m_CXForm.AlphaAddTerm))); int maxMultValue = max(max(abs(m_CXForm.RedMultTerm >> 8), abs(m_CXForm.GreenMultTerm >> 8)), max(abs(m_CXForm.BlueMultTerm >> 8), abs(m_CXForm.AlphaMultTerm >> 8))); int maxAddValue = max(max(redAdd >> 8, greenAdd >> 8), max(blueAdd >> 8, alphaAdd >> 8)); int maxValue = max(maxMultValue, maxAddValue); UCHAR bitsNeaded = 0; int currentByte=0, bitOffset=0, i; // Calculate bits neaded while (pow(2, bitsNeaded) < maxValue) bitsNeaded++; bitsNeaded += 10; m_CXForm.Flags = (0x03 << 4) | bitsNeaded; // Create byte field m_SWFStreamLength = (8*bitsNeaded + 6) / 8; if ((8*bitsNeaded + 6) % 8 != 0) m_SWFStreamLength++; if (m_SWFStream != NULL) delete m_SWFStream; m_SWFStream = new UCHAR[m_SWFStreamLength]; memset(m_SWFStream, 0, m_SWFStreamLength); // Set bits neaded m_SWFStream[currentByte] = (m_CXForm.Flags << 2); bitOffset = 6; // Write RedMultTerm bit-field currentByte = bitOffset / 8; USHORT redMultTerm = m_CXForm.RedMultTerm << (16 - bitsNeaded); USHORT maskRedMultTerm = 0x8000; for (i=0; i<bitsNeaded; i++) { m_SWFStream[currentByte] |= (((redMultTerm & maskRedMultTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1)); bitOffset++; if ((bitOffset != 0) && (bitOffset % 8) == 0) currentByte++; maskRedMultTerm = maskRedMultTerm >> 1; } // Write GreenMultTerm bit-field currentByte = bitOffset / 8; USHORT greenMultTerm = m_CXForm.GreenMultTerm << (16 - bitsNeaded); USHORT maskGreenMultTerm = 0x8000; for (i=0; i<bitsNeaded; i++) { m_SWFStream[currentByte] |= (((greenMultTerm & maskGreenMultTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1)); bitOffset++; if ((bitOffset != 0) && (bitOffset % 8) == 0) currentByte++; maskGreenMultTerm = maskGreenMultTerm >> 1; } // Write BlueMultTerm bit-field currentByte = bitOffset / 8; USHORT blueMultTerm = m_CXForm.BlueMultTerm << (16 - bitsNeaded); USHORT maskBlueMultTerm = 0x8000; for (i=0; i<bitsNeaded; i++) { m_SWFStream[currentByte] |= (((blueMultTerm & maskBlueMultTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1)); bitOffset++; if ((bitOffset != 0) && (bitOffset % 8) == 0) currentByte++; maskBlueMultTerm = maskBlueMultTerm >> 1; } // Write AlphaMultTerm bit-field currentByte = bitOffset / 8; USHORT alphaMultTerm = m_CXForm.AlphaMultTerm << (16 - bitsNeaded); USHORT maskAlphaMultTerm = 0x8000; for (i=0; i<bitsNeaded; i++) { m_SWFStream[currentByte] |= (((alphaMultTerm & maskAlphaMultTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1)); bitOffset++; if ((bitOffset != 0) && (bitOffset % 8) == 0) currentByte++; maskAlphaMultTerm = maskAlphaMultTerm >> 1; } // Write RedAddTerm bit-field currentByte = bitOffset / 8; USHORT redAddTerm = m_CXForm.RedAddTerm << (16 - bitsNeaded); USHORT maskRedAddTerm = 0x8000; for (i=0; i<bitsNeaded; i++) { m_SWFStream[currentByte] |= (((redAddTerm & maskRedAddTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1)); bitOffset++; if ((bitOffset != 0) && (bitOffset % 8) == 0) currentByte++; maskRedAddTerm = maskRedAddTerm >> 1; } // Write GreenAddTerm bit-field currentByte = bitOffset / 8; USHORT greenAddTerm = m_CXForm.GreenAddTerm << (16 - bitsNeaded); USHORT maskGreenAddTerm = 0x8000; for (i=0; i<bitsNeaded; i++) { m_SWFStream[currentByte] |= (((greenAddTerm & maskGreenAddTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1)); bitOffset++; if ((bitOffset != 0) && (bitOffset % 8) == 0) currentByte++; maskGreenAddTerm = maskGreenAddTerm >> 1; } // Write BlueAddTerm bit-field currentByte = bitOffset / 8; USHORT blueAddTerm = m_CXForm.BlueAddTerm << (16 - bitsNeaded); USHORT maskBlueAddTerm = 0x8000; for (i=0; i<bitsNeaded; i++) { m_SWFStream[currentByte] |= (((blueAddTerm & maskBlueAddTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1)); bitOffset++; if ((bitOffset != 0) && (bitOffset % 8) == 0) currentByte++; maskBlueAddTerm = maskBlueAddTerm >> 1; } // Write AlphaAddTerm bit-field currentByte = bitOffset / 8; USHORT alphaAddTerm = m_CXForm.AlphaAddTerm << (16 - bitsNeaded); USHORT maskAlphaAddTerm = 0x8000; for (i=0; i<bitsNeaded; i++) { m_SWFStream[currentByte] |= (((alphaAddTerm & maskAlphaAddTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1)); bitOffset++; if ((bitOffset != 0) && (bitOffset % 8) == 0) currentByte++; maskAlphaAddTerm = maskAlphaAddTerm >> 1; } return m_SWFStream; } int CSWFColorTransform::GetSWFStreamLength() { return m_SWFStreamLength; }